#ifndef _APP_SENSOR_DATA_STRUCT_H
#define _APP_SENSOR_DATA_STRUCT_H

#include <time.h>

typedef enum{
	TYPE_START = 0,
	CO2,
	O2,
	TEMP,
	TYPE_END,
	ERR_TYPE,
}sensor_type_t;

#define TYPE_VAILD(x) ((x) > TYPE_START && (x) < TYPE_END)

/***************************************************************
 * Name:	 sensor_data_type_to_str()
 * Input : type 数据类型 
 * Output: str 类型转换的字符串 char[10]
 * Return: 0成功 -1失败
 * Author: hwl
 * Revise: V1.0
 * Description: 数据类型转换为字符串
 ***************************************************************/
int sensor_data_type_to_str(sensor_type_t type, char* str);

/***************************************************************
 * Name:	 sensor_data_str_to_type()
 * Input : str 类型转换的字符串 type 字符串转换的数据类型
 * Output: void
 * Return: 0成功 -1失败
 * Author: hwl
 * Revise: V1.0
 * Description: 字符串转换为数据类型
 ***************************************************************/
int sensor_data_str_to_type(const char* str, sensor_type_t* type);

typedef struct _sensor_data_t sensor_data_t;

/***************************************************************
 * Name:	 sensor_data_size()
 * Input : void
 * Output: void
 * Return: 数据结构体需要的内存大小
 * Author: hwl
 * Revise: V1.0
 * Description: 数据结构体需要的内存大小
 ***************************************************************/
size_t sensor_data_size(void);

/***************************************************************
 * Name:	 sensor_data_size()
 * Input : list_head 队列指针头 item 队列第几项
 * Output: void
 * Return: 该项对应的地址指针
 * Author: hwl
 * Revise: V1.0
 * Description: 队列项对应的地址指针
 ***************************************************************/
sensor_data_t* sensor_data_list_col(sensor_data_t* list_head, size_t item);

/*生成和释放数据*/
/***************************************************************
 * Name:	 sensor_data_create()
 * Input : sn 数据的SN号 type 数据的类型 data 数据的数据值
 * Output: void
 * Return: !=NULL 生成的数据结构体
 * Author: hwl
 * Revise: V1.0
 * Description: 生成数据结构体
 ***************************************************************/
sensor_data_t* sensor_data_create(const char* sn,
																	const sensor_type_t type, const float data);

/***************************************************************
 * Name:	 sensor_data_destroy()
 * Input : data 生成的数据类型内存
 * Output: void
 * Return: void 
 * Author: hwl
 * Revise: V1.0
 * Description: 销毁数据结构体
 ***************************************************************/
void sensor_data_destroy(sensor_data_t* data);

/***************************************************************
 * Name:	 sensor_data_printf()
 * Input : data 生成的数据类型内存
 * Output: void
 * Return: void 
 * Author: hwl
 * Revise: V1.0
 * Description: 打印数据结构体
 ***************************************************************/
void sensor_data_printf(const sensor_data_t* sensor);

/*设置数据*/
/***************************************************************
 * Name:	 sensor_data_set_cur_date()
 * Input : sensor 数据结构体
 * Output: void
 * Return: void
 * Author: hwl
 * Revise: V1.0
 * Description: 设置数据的时间
 ***************************************************************/
void sensor_data_set_cur_date(sensor_data_t* sensor);

/***************************************************************
 * Name:	 sensor_data_set_custom_date()
 * Input : sensor 数据结构体 data 时间字符串 char[20] "2025-03-04 14:22:00"
 * Output: void
 * Return: void
 * Author: hwl
 * Revise: V1.0
 * Description: 设置数据的时间
 ***************************************************************/
void sensor_data_set_custom_date(sensor_data_t* sensor, time_t date);

/***************************************************************
 * Name:	 sensor_data_set_sn()
 * Input : sensor 数据结构体 sn 设置的SN号 char[11]
 * Output: void
 * Return: void
 * Author: hwl
 * Revise: V1.0
 * Description: 设置传感器数据的SN号
 ***************************************************************/
void sensor_data_set_sn(sensor_data_t* sensor, const char* sn);

/***************************************************************
 * Name:	 sensor_data_set_type()
 * Input : sensor 数据结构体 type 设置的类型
 * Output: void
 * Return: void
 * Author: hwl
 * Revise: V1.0
 * Description: 设置传感器数据的类型
 ***************************************************************/
void sensor_data_set_type(sensor_data_t* sensor, const sensor_type_t type);

/***************************************************************
 * Name:	 sensor_data_set_sn()
 * Input : sensor 数据结构体 data 设置的数据
 * Output: void
 * Return: void
 * Author: hwl
 * Revise: V1.0
 * Description: 设置传感器数据的数据
 ***************************************************************/
void sensor_data_set_data(sensor_data_t* sensor, const float data);

/*获取数据*/
/***************************************************************
 * Name:	 sensor_data_set_type()
 * Input : sensor 数据结构体 date 存储时间字符串的空间 char[20]
 * Output: void
 * Return: void
 * Author: hwl
 * Revise: V1.0
 * Description: 获取传感器数据的时间
 ***************************************************************/
void sensor_data_get_date(const sensor_data_t* sensor, char* date);

/***************************************************************
 * Name:	 sensor_data_get_sn()
 * Input : sensor 数据结构体 sn 存储SN号字符串的空间 char[11]
 * Output: void
 * Return: void
 * Author: hwl
 * Revise: V1.0
 * Description: 获取传感器数据的SN号
 ***************************************************************/
void sensor_data_get_sn(const sensor_data_t* sensor, char* sn);

/***************************************************************
 * Name:	 sensor_data_get_sn()
 * Input : sensor 数据结构体 sn 存储SN号字符串的空间 
 * Output: void
 * Return: void
 * Author: hwl
 * Revise: V1.0
 * Description: 获取传感器数据的SN号
 ***************************************************************/
void sensor_data_get_type(const sensor_data_t* sensor, sensor_type_t* type);

/***************************************************************
 * Name:	 sensor_data_get_sn()
 * Input : sensor 数据结构体 sn 存储SN号字符串的空间 
 * Output: void
 * Return: void
 * Author: hwl
 * Revise: V1.0
 * Description: 获取传感器数据的SN号
 ***************************************************************/
void sensor_data_get_data(const sensor_data_t* sensor, float* data);

#endif